package com.mnb.beidou.service;


import com.mnb.beidou.model.ModbusDataEntity;
import com.mnb.beidou.model.PSDataEntity;
import com.mnb.beidou.utils.ByteUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
@Component
public class PSParser {

    @Autowired
    private ModbusParser modbusParser;

    private static final String[] SRCADD_RARRAY  = {"23104332186","23104332187"};

    public PSDataEntity parse(byte[] frame) throws Exception {

        PSDataEntity entity = new PSDataEntity();

        // 计算整个帧的总字节数（从系统识别码到帧校验）
        int totalFrameBytes = frame.length;

        int offset = 0;

        // 1. 系统识别码（3字节，BCD）
        byte[] sysId = Arrays.copyOfRange(frame, offset, offset + 3);
        offset += 3;
        entity.setSysId(ByteUtils.bcdToDecimal(sysId, false));

        // 2. 整帧长度（2字节，十六进制，高字节在前）
        int frameLength = ((frame[offset] & 0xFF) << 8) | (frame[offset + 1] & 0xFF);
        offset += 2;
        entity.setFrameLength(frameLength);

        // 3. 包序号（1字节）
        byte pkgSeq = frame[offset++];
        entity.setPkgSeq(String.format("%02X", pkgSeq));

        // 4. 帧类型（1字节）
        byte frameType = frame[offset++];
        entity.setFrameType(String.format("%02X", frameType));

        // 5. 源地址长度（1字节）
        int srcAddrLen = frame[offset++] & 0xFF;
        entity.setSrcAddrLen(String.format("%02X", srcAddrLen));

        // 6. 源地址（(srcAddrLen+1)/2 字节，BCD）
        int srcAddrByteLen = (srcAddrLen + 1) / 2;
        byte[] srcAddrBytes = Arrays.copyOfRange(frame, offset, offset + srcAddrByteLen);
        offset += srcAddrByteLen;
        String srcAddrStr = ByteUtils.bcdToDecimal(srcAddrBytes, false);
        String srcAddr = srcAddrStr.length() >= srcAddrLen ? srcAddrStr.substring(0, srcAddrLen) : srcAddrStr;
        entity.setSrcAddr(srcAddr);

        boolean contains = Arrays.asList(SRCADD_RARRAY).contains(srcAddr);
        if(!contains){
            // 不是特定接收的数据 不处理
            return null;
        }

        // 7. 目的地址长度（1字节）
        int destAddrLen = frame[offset++] & 0xFF;
        entity.setDestAddrLen(destAddrLen);

        // 8. 目的地址（(destAddrLen+1)/2 字节，BCD）
        int destAddrByteLen = (destAddrLen + 1) / 2;
        byte[] destAddrBytes = Arrays.copyOfRange(frame, offset, offset + destAddrByteLen);
        offset += destAddrByteLen;
        String destAddrStr = ByteUtils.bcdToDecimal(destAddrBytes, true);
        String destAddr = destAddrStr.length() >= destAddrLen ? destAddrStr.substring(0, destAddrLen) : destAddrStr;
        entity.setDestAddr(destAddr);

        // 9. 帧内容（基于整个帧总长度计算）
        // 帧内容长度 = 总长度 - 已解析长度 - 1字节校验位
        int contentLen = totalFrameBytes - offset - 1;
        byte[] content = Arrays.copyOfRange(frame, offset, offset + contentLen);
        offset += contentLen;
        entity.setModbusContent(ByteUtils.bytesToHex(content));

        // 10. 帧校验（1字节，异或校验）
        byte checksum = frame[offset++];
        entity.setChecksum(String.format("%02X", checksum));

        ModbusDataEntity parse = modbusParser.parse(entity.getModbusContent());
        entity.setModbusDataEntity(parse);

        return entity;
    }
}
